bitkeeper revision 1.1159.28.1 (411ce7c8olPyp1mOhZBrwe7zhBtEWg)
authormjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Fri, 13 Aug 2004 16:09:44 +0000 (16:09 +0000)
committermjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Fri, 13 Aug 2004 16:09:44 +0000 (16:09 +0000)
Add support for configuring the back-end domain for vbd or vif devices.

docs/xen_config.html
tools/python/xen/xend/XendDomainInfo.py
tools/python/xen/xend/server/SrvDaemon.py
tools/python/xen/xm/create.py

index 45499667acdfc27ba9d1df3ba1771b56d9fac242..81258c51893790a85b65edc4ecc1a4c099d93e43 100644 (file)
@@ -62,7 +62,7 @@ The top-level element, a virtual machine configuration.
     <li>memory: int, required. Domain memory in MB.
     <li>cpu: int, optional. Cpu to run on.
     <li>image: linux | netbsd | ..., required. Domain image (OS-specific element).
-    <li>controller: any device controller type, optional, default none.
+    <li>backend: any backend device type, optional, default none.
     <li>device: any device type, optional, repeats. Device.
     <li>restart: string, optional, default onreboot. Restart mode, one of
         <ul><li>onreboot: restart the domain when it exits with code reboot.
@@ -99,7 +99,21 @@ block devices.
 
 <h2>(backend (netif)) element</h2>
 The vm is a net device backend.
-The domain may not have virtual network interfaces (vifs) configured.
+The vm may not have virtual network interfaces (vifs) configured.
+
+<h2>(backend (vbd) element</h2>
+Defines the domain to use as the backend for virtual block devices.
+The domain must exist.
+<ul>
+    <li>domain: string, required. Domain name or id.
+</ul>
+
+<h2>(backend (vif) element</h2>
+Defines the domain to use as the backend for virtual network interfaces.
+The domain must exist.
+<ul>
+    <li>dom: string, required. Domain name or id.
+</ul>
 
 <h2>(device (vif)) element</h2>
 Defines a virtual network interface.
index ce01d28b0a542478662bcb19f9cb822c3e9b6ad3..0f17c10b4e29f050731527ea93b13781c988f5c5 100644 (file)
@@ -69,6 +69,12 @@ STATE_RESTART_BOOTING = 'booting'
 STATE_VM_OK         = "ok"
 STATE_VM_TERMINATED = "terminated"
 
+
+def domain_exists(name):
+    # See comment in XendDomain constructor.
+    xd = get_component('xen.xend.XendDomain')
+    return xd.domain_exists(name)
+
 def shutdown_reason(code):
     """Get a shutdown reason from a code.
 
@@ -131,10 +137,10 @@ def lookup_disk_uname(uname):
         segments = None
     return segments
 
-def make_disk(dom, uname, dev, mode, recreate=0):
+def make_disk(vm, uname, dev, mode, recreate=0):
     """Create a virtual disk device for a domain.
 
-    @param dom:      domain id
+    @param vm:       vm
     @param uname:    device to export
     @param dev:      device name in domain
     @param mode:     read/write mode
@@ -148,10 +154,11 @@ def make_disk(dom, uname, dev, mode, recreate=0):
         raise VmError("vbd: Multi-segment vdisk: uname=%s" % uname)
     segment = segments[0]
     vdev = blkdev_name_to_number(dev)
-    ctrl = xend.blkif_create(dom, recreate=recreate)
+    backend = vm.get_device_backend('vbd')
+    ctrl = xend.blkif_create(vm.dom, recreate=recreate, backend=backend)
     
     def fn(ctrl):
-        return xend.blkif_dev_create(dom, vdev, mode, segment, recreate=recreate)
+        return xend.blkif_dev_create(vm.dom, vdev, mode, segment, recreate=recreate)
     ctrl.addCallback(fn)
     return ctrl
         
@@ -371,6 +378,7 @@ class XendDomainInfo:
         self.console = None
         self.devices = {}
         self.device_index = {}
+        self.device_backends = {}
         self.configs = []
         self.info = None
         self.ipaddrs = []
@@ -466,9 +474,7 @@ class XendDomainInfo:
             if c in '_-.': continue
             if c in string.ascii_letters: continue
             raise VmError('invalid vm name')
-        # See comment in XendDomain constructor.
-        xd = get_component('xen.xend.XendDomain')
-        dominfo = xd.domain_exists(name)
+        dominfo = domain_exists(name)
         # When creating or rebooting, a domain with my name should not exist.
         # When restoring, a domain with my name will exist, but it should have
         # my domain id.
@@ -663,6 +669,7 @@ class XendDomainInfo:
         
         self.devices = {}
         self.device_index = {}
+        self.device_backends = {}
         self.configs = []
         self.ipaddrs = []
 
@@ -901,15 +908,40 @@ class XendDomainInfo:
             self.restart_state = None
         return d
 
+    def configure_device_backend(self, type, sxpr):
+        """Configure the backend domain to use for devices of a given type.
+
+        @param type: device type
+        @param sxpr: config
+        @raise: VmError if the domain id is missing
+        @raise: VmError if the domain does not exist
+        """
+        dom = sxp.child_value(sxpr, 'domain')
+        if dom is None:
+            raise VmError('missing backend domain')
+        dominfo = domain_exists(dom)
+        if dominfo is None:
+            raise VmError('invalid backend domain:' + dom)
+        self.device_backends[type] = dominfo.dom
+
+    def get_device_backend(self, type):
+        return self.device_backends.get(type, 0)
+
     def configure_backends(self):
-        """Set configuration flags if the vm is a backend for netif of blkif.
+        """Set configuration flags if the vm is a backend for netif or blkif.
+        Configure the backends to use for vbd and vif if specified.
         """
         for c in sxp.children(self.config, 'backend'):
-            name = sxp.name(sxp.child0(c))
+            v = sxp.child0(c)
+            name = sxp.name(v)
             if name == 'blkif':
                 self.blkif_backend = 1
             elif name == 'netif':
                 self.netif_backend = 1
+            elif name == 'vbd':
+                self.configure_device_backend('vbd', v)
+            elif name == 'vif':
+                self.configure_device_backend('vif', v)
             else:
                 raise VmError('invalid backend type:' + str(name))
 
@@ -1039,7 +1071,8 @@ def vm_dev_vif(vm, val, index):
         raise VmError('vif: vif in netif backend domain')
     vif = vm.next_device_index('vif')
     vmac = sxp.child_value(val, "mac")
-    xend.netif_create(vm.dom, recreate=vm.recreate)
+    backend = vm.get_device_backend('vif')
+    xend.netif_create(vm.dom, recreate=vm.recreate, backend=backend)
     log.debug("Creating vif dom=%d vif=%d mac=%s", vm.dom, vif, str(vmac))
     defer = xend.netif_dev_create(vm.dom, vif, val, recreate=vm.recreate)
     def fn(id):
@@ -1068,7 +1101,7 @@ def vm_dev_vbd(vm, val, index):
         raise VmError('vbd: Missing dev')
     mode = sxp.child_value(val, 'mode', 'r')
     log.debug("Creating vbd dom=%d uname=%s dev=%s", vm.dom, uname, dev)
-    defer = make_disk(vm.dom, uname, dev, mode, vm.recreate)
+    defer = make_disk(vm, uname, dev, mode, vm.recreate)
     def fn(vbd):
         vbd.dev = dev
         vbd.uname = uname
index aaeef6d54cfcf5e2d920af3a322a63bb8283929b..e6a1f309008e462aa44996475cefcfd8ef741c2f 100644 (file)
@@ -661,12 +661,12 @@ class Daemon:
         """
         return self.blkifCF.getControlDomain()
     
-    def blkif_create(self, dom, recreate=0):
+    def blkif_create(self, dom, recreate=0, backend=0):
         """Create a block device interface controller.
         
         Returns Deferred
         """
-        d = self.blkifCF.createInstance(dom, recreate=recreate)
+        d = self.blkifCF.createInstance(dom, recreate=recreate, backend=backend)
         return d
 
     def blkifs(self):
@@ -699,11 +699,11 @@ class Daemon:
         """
         return self.netifCF.getControlDomain()
     
-    def netif_create(self, dom, recreate=0):
+    def netif_create(self, dom, recreate=0, backend=0):
         """Create a network interface controller.
         
         """
-        return self.netifCF.createInstance(dom, recreate=recreate)
+        return self.netifCF.createInstance(dom, recreate=recreate, backend=backend)
 
     def netifs(self):
         return [ x.sxpr() for x in self.netifCF.getInstances() ]
index 69d6fb0b1f38390de7bd2b92c25d4541bbceb243..e9f45e9713a7b71f3d9792241131e910f6fe2ef4 100644 (file)
@@ -121,6 +121,14 @@ gopts.var('netif', val='no|yes',
           fn=set_bool, default=0,
           use="Make the domain a network interface backend.")
 
+gopts.var('vbd_backend', val='DOM',
+          fn=set_value, default=None,
+          use='Set the domain to use for the vbd backend.')
+
+gopts.var('vif_backend', val='DOM',
+          fn=set_value, default=None,
+          use='Set the domain to use for the vif backend.')
+
 gopts.var('disk', val='phy:DEV,VDEV,MODE',
           fn=append_value, default=[],
           use="""Add a disk device to a domain. The physical device is DEV,
@@ -306,6 +314,10 @@ def make_config(vals):
         config.append(['backend', ['blkif']])
     if vals.netif:
         config.append(['backend', ['netif']])
+    if vals.vbd_backend:
+        config.append(['backend', ['vbd', ['dom', vals.vbd_backend]]])
+    if vals.vif_backend:
+        config.append(['backend', ['vif', ['dom', vals.vif_backend]]])
     if vals.restart:
         config.append(['restart', vals.restart])
     if vals.console: